home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_100
/
173_01
/
word.lxi
< prev
next >
Wrap
Text File
|
1980-01-01
|
2KB
|
75 lines
/*
* Count words -- interactively
*/
white = [\n\t ]; /* End of a word */
eol = [\0]; /* End of input line */
any = [!-~]; /* All printing char's */
illegal = [\0-\377]; /* Skip over junk */
%{
char line[133];
char *linep = line;
int is_eof = 0;
int wordct = 0;
#define T_EOL 1
main()
{
register int i;
while ((i = yylex()) != 0) {
/*
* If the "end-of-line" token is returned
* AND we're really at the end of a line,
* read the next line. Note that T_EOL is
* returned twice when the program starts
* because of the nature of the look-ahead
* algorithms.
*/
if (i == T_EOL && !is_eof && *linep == 0) {
printf("* ");
getline();
}
}
printf("%d words\n", wordct);
}
%}
%%
any(any)* {
/*
* Write each word on a seperate line
*/
lexecho(stdout);
printf("\n");
wordct++;
return(LEXSKIP);
}
eol {
return(T_EOL);
}
white(white)* {
return(LEXSKIP);
}
%%
getline()
/*
* Read a line for lexgetc()
*/
{
extern char *fgets();
is_eof = (fgets(line, sizeof line, stdin) == NULL);
linep = line;
}
lexgetc()
/*
* Homemade lexgetc -- return zero while at the end of an
* input line or EOF at end of file. If more on this line,
* return it.
*/
{
return((is_eof) ? EOF : (*linep == 0) ? 0 : *linep++);
}